/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: ChecksumValidator.java,v 1.1 2006/05/06 09:00:04 ckaestne Exp $
*/
package com.sleepycat.je.log;
import java.nio.ByteBuffer;
import java.util.zip.Checksum;
import com.sleepycat.je.dbi.EnvironmentImpl;
import com.sleepycat.je.utilint.Adler32;
import com.sleepycat.je.utilint.DbLsn;
/**
* Checksum validator is used to check checksums on log entries.
*/
class ChecksumValidator {
private static final boolean DEBUG = false;
private Checksum cksum;
ChecksumValidator() {
cksum = Adler32.makeChecksum();
}
void reset() {
cksum.reset();
}
/**
* Add this byte buffer to the checksum. Assume the byte buffer is already
* positioned at the data.
* @param buf target buffer
* @param length of data
*/
void update(EnvironmentImpl env,
ByteBuffer buf,
int length,
boolean anticipateChecksumErrors)
throws DbChecksumException {
if (buf == null) {
throw new DbChecksumException
((anticipateChecksumErrors ? null : env),
"null buffer given to checksum validation, probably " +
" result of 0's in log file. " + anticipateChecksumErrors);
}
int bufStart = buf.position();
if (DEBUG) {
System.out.println("bufStart = " + bufStart +
" length = " + length);
}
if (buf.hasArray()) {
cksum.update(buf.array(), bufStart, length);
} else {
for (int i = bufStart; i < (length + bufStart); i++) {
cksum.update(buf.get(i));
}
}
}
void validate(EnvironmentImpl env,
long expectedChecksum,
long lsn)
throws DbChecksumException {
if (expectedChecksum != cksum.getValue()) {
throw new DbChecksumException
(env,
"Location " + DbLsn.getNoFormatString(lsn) +
" expected " + expectedChecksum + " got " + cksum.getValue());
}
}
void validate(EnvironmentImpl env,
long expectedChecksum,
long fileNum,
long fileOffset,
boolean anticipateChecksumErrors)
throws DbChecksumException {
if (expectedChecksum != cksum.getValue()) {
long problemLsn = DbLsn.makeLsn(fileNum, fileOffset);
/*
* Pass null for env so that RunRecoveryException() does not
* invalidate the environment.
*/
throw new DbChecksumException
((anticipateChecksumErrors ? null : env),
"Location " + DbLsn.getNoFormatString(problemLsn) +
" expected " + expectedChecksum + " got " +
cksum.getValue());
}
}
}